package com.ibatis4J.framework.dal.client;

import java.util.List;
import java.util.Map;

import com.ibatis4J.framework.dal.pagination.Pagination;
import com.ibatis4J.framework.dal.pagination.PaginationResult;
import org.springframework.jdbc.core.RowMapper;

/**
 * 分页client接口类
 * 
 * @author liuwenya
 *
 */
public interface IPaginationDalClient extends DalClient {
	/**
	 * 偏移量
	 */
	String OFFSET="offset";
	
	/**
	 * 
	 * 返回指定的记录数
	 */
	String LIMIT="limit";
	
	/**
	 * 初始SQL
	 */
	String ORIGSQL="origsql";
	
	/**
     * 查询并返回分页结果，pagesize为负数时，返回所有记录
     * 
     * @param sqlId SQLID
     * @param param 查询参数
     * @param pagination 分页
     * @return 分页查询结果
     */
	PaginationResult<List<Map<String, Object>>> queryForList(String sqlId, Map<String, Object> paramMap, Pagination pagination);

	/**
	 * 获取分页处理结果 重载方法
	 *
	 * @param sqlId SQLID
	 * @param paramMap 查询参数
	 * @param requiredType 需要操作的类型
	 * @param pagination 分页
	 * @param <T> 泛型对象
	 * @return List类型的查询结果
	 */
	<T> PaginationResult<List<T>> queryForList(String sqlId, Map<String, Object> paramMap, Class<T> requiredType,
											   Pagination pagination);

	/**
	 * 获取分页处理结果 重载方法
	 *
	 * @param sqlId SQLID
	 * @param paramMap 查询参数
	 * @param rowMapper 翻页处理规则
	 * @param pagination 分页
	 * @param <T> 泛型对象
	 * @return List类型的查询结果
	 */
	<T> PaginationResult<List<T>> queryForList(String sqlId, Map<String, Object> paramMap, RowMapper<T> rowMapper,
											   Pagination pagination);

	/**
	 * 获取分页处理结果
	 *
	 * @param sqlId SQLID
	 * @param param 查询参数
	 * @param pagination 分页
	 * @return List类型的查询结果
	 */
	PaginationResult<List<Map<String, Object>>> queryForList(String sqlId, Object param, Pagination pagination);

	/**
	 * 获取分页处理结果 重载方法
	 *
	 * @param sqlId SQLID
	 * @param param 查询参数
	 * @param rowMapper 翻页处理规则
	 * @param pagination 分页
	 * @param <T> 泛型对象
	 * @return List类型的查询结果
	 */
	<T> PaginationResult<List<T>> queryForList(String sqlId, Object param, RowMapper<T> rowMapper, Pagination pagination);


	/**
	 * 获取分页处理结果 重载方法
	 *
	 * @param sqlId SQLID
	 * @param param 查询参数
	 * @param requiredType 需要操作的类型
	 * @param pagination 分页
	 * @param <T> 泛型对象
	 * @return List类型的查询结果
	 */
	<T> PaginationResult<List<T>> queryForList(String sqlId, Object param, Class<T> requiredType, Pagination pagination);
}
